package cn.lxb.web.starter.template.controller;

import cn.lxb.web.starter.template.domain.dto.ConvertDTO;
import cn.lxb.web.starter.template.exception.ApplicationException;
import cn.lxb.web.starter.template.service.BaseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.ParameterizedType;

/**
 * 基础控制器
 *
 * @param <D>  DTO对象类型
 * @param <E>  实体对象类型
 * @param <S>  服务接口类型
 * @param <PK> 实体主键类型
 * @author 54lxb
 * @since 2019-11-20
 */
public abstract class AbstractBaseController<D, E extends ConvertDTO<D>, S extends BaseService<E, PK>, PK> implements FindController<D, E, S, PK>, SaveController<D, E, S, PK>, UpdateController<D, E, S, PK>, DeleteController<D, E, S, PK> {

    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractBaseController.class);

    @Autowired
    protected S service;

    @Override
    public S getService() {
        return service;
    }

    /**
     * 初始化新实体对象
     *
     * @return 实体对象
     */
    @Override
    public E newEntity() {
        Class<E> clazz = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
        try {
            return clazz.newInstance();
        } catch (Exception e) {
            LOGGER.debug(e.getMessage(), e);
            throw new ApplicationException(e.getMessage(), e);
        }
    }

}
